package com.dp.server;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Scanner;

import javax.servlet.http.HttpServletResponse;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.CiudadDTO;
import com.dp.client.dto.ClienteDTO;
import com.dp.client.dto.ConexionDTO;
import com.dp.client.dto.ContinenteDTO;
import com.dp.client.dto.PaisDTO;
import com.dp.client.dto.PaqueteDTO;
import com.dp.client.dto.VueloDTO;
import com.dp.server.entities.Almacen;
import com.dp.server.entities.Ciudad;
import com.dp.server.entities.Cliente;
import com.dp.server.entities.Conexion;
import com.dp.server.entities.Pais;
import com.dp.server.entities.Paquete;
import com.dp.server.entities.Vuelo;

public class CargarArchivo 
{
	MantenimientoGenerico<Conexion> mConexion = new MantenimientoGenerico<>("Conexion");
	public String RegistrarPaquete(Scanner in_scanner,HttpServletResponse resp,Almacen almacen)
	{
		try
		{
			List<Paquete> lista = new ArrayList<Paquete>();
			while(in_scanner.hasNext())
			{
				String linea = in_scanner.nextLine();
				lista.add(obtenerPaquete(linea,almacen,1,0,0));
			}
			MantenimientoGenerico<Paquete> mantemiento = new MantenimientoGenerico<>("Paquete");
			mantemiento.registrarBatch(lista, 1000);
			return "Se ha registrado "+lista.size()+" paquetes";
		}
		catch(Exception e)
		{
			return e.toString();
		}
	}
	
	public String RegistrarCliente(Scanner in_scanner,HttpServletResponse resp)
	{
		try
		{
			List<Cliente> lista = new ArrayList<Cliente>();
			while(in_scanner.hasNext())
			{
				Cliente cliente = new Cliente();
				in_scanner.nextLine();
				Date date = new Date();
				cliente.setNombre(in_scanner.next());
				cliente.setApellido1(in_scanner.next());
				cliente.setApellido2(in_scanner.next());
				cliente.setCorreo(in_scanner.next());
				cliente.setFechaRegistro(date);
				lista.add(cliente);
			}
			resp.getWriter().println(lista.size());
			MantenimientoGenerico<Cliente> mantemiento = new MantenimientoGenerico<>("Cliente");
			mantemiento.registrarBatch(lista, 30);
			return "Exito";
		}
		catch (Exception e)
		{
			return e.toString();
		}
	}
	
	public String RegistrarAlmacen(Scanner in_scanner,HttpServletResponse resp)
	{
		try
		{
			IServiciosGeograficosImpl geografico = new IServiciosGeograficosImpl();
			List<Almacen> lista = new ArrayList<Almacen>();
			while(in_scanner.hasNext())
			{
				in_scanner.nextLine();
				Almacen almacen = new Almacen();
				almacen.setLatitud(in_scanner.nextDouble());
				almacen.setLongitud(in_scanner.nextDouble());
				
				//cambiar almacen
				//almacen.setIdentificacion(in_scanner.next());
				Ciudad ciudad = new Ciudad();
				ciudad.setNombre(in_scanner.next());
				Pais pais = new Pais();
				pais.setNombre(in_scanner.next());
				pais.setContinenteId(1);
				int id = geografico.hayPais(pais.getNombre()); 
				if(id==0)//No hay pais
				{
					pais.setId(geografico.RegistraPais(pais));
				}
				else
					pais.setId(id);
				ciudad.setPaisId(pais.getId());
				id = geografico.hayCiudad(ciudad.getNombre());
				if(id==0)//No hay ciudad
				{
					ciudad.setId(geografico.RegistraCiudad(ciudad));
				}
				else
					ciudad.setId(id);
				almacen.setCapacidadMaxima(0);
				almacen.setCiudadId(ciudad.getId());
				resp.getWriter().println("ff"+almacen.getLatitud()+" "+almacen.getLongitud()+" "+almacen.getCapacidadMaxima());
				lista.add(almacen);
			}
			MantenimientoGenerico<Almacen> mantemiento = new MantenimientoGenerico<>("Almacen");
			mantemiento.registrarBatch(lista, 30);
			return "Se ha registrado "+lista.size()+" almacenes";
		}
		catch (Exception e)
		{
			return e.toString();
		}
	}
	
	public String RegistrarConexion(Scanner in_scanner, HttpServletResponse resp)
	{
		try
		{
			IServiciosConexionImpl con = new IServiciosConexionImpl();
			IServiciosGeograficosImpl geo = new IServiciosGeograficosImpl();
			List<Conexion> lista = new ArrayList<Conexion>();
			while(in_scanner.hasNext())
			{
				Conexion conexion = new Conexion();
				String linea = in_scanner.nextLine();
				
				String origen = linea.substring(0, 4);				
				String destino = linea.substring(5, 9);
				int hora = Integer.parseInt(linea.substring(10, 12));
				int min = Integer.parseInt(linea.substring(13, 15));
				Almacen almacenO = geo.hayCodigo(origen);
				Almacen almacenD = geo.hayCodigo(destino);
				conexion.setIdOrigen(almacenO.getId());
				conexion.setIdDestino(almacenD.getId());
				Date date = new Date();
				CiudadDTO ciudadO = geo.getCiudad(almacenO.getCiudadId());
				CiudadDTO ciudadD = geo.getCiudad(almacenD.getCiudadId());
				int gmt = ciudadO.getGmt();
				hora-=gmt;
				if(hora<0)
					date.setHours(24+hora);
				else
					date.setHours(hora);
				date.setMinutes(min);
				date.setSeconds(0);
				long x = date.getTime() / 1000;
				x = x * 1000;
				date.setTime(x);
				conexion.setHoraSalida(date);
				if(ciudadO.getPais().getContinente().getId() == ciudadD.getPais().getContinente().getId())
					conexion.setDuracion(12);
				else
					conexion.setDuracion(24);
				boolean [] bol= new boolean[7];
				for(int i=0;i<7;i++)
					bol[i]=true;
				conexion.setDiasActivos(bol);
				conexion.setEliminado(false);
				conexion.setCapacidad(200);
				
				Calendar cal = Calendar.getInstance();
				cal.setTime(conexion.getHoraSalida());
				cal.add(Calendar.HOUR_OF_DAY,-1032);			
				conexion.setDescripcion("Desde "+almacenO.getDescripcion()+" a "+almacenD.getDescripcion());
				conexion = mConexion.registra( conexion );
				con.crearVuelos(conexion.extractDTO(),cal.getTime(), 65, 0);
				System.out.println(conexion.getIdDestino()+" "+conexion.getIdOrigen()+" "+conexion.getHoraSalida().toString()+" "+lista.size());
				lista.add(conexion);
			}
			return "Se ha registrado "+lista.size()+" conexiones";
		}
		catch (Exception e)
		{
			return e.toString();
		}
	}
	static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public Paquete obtenerPaquete(String linea, Almacen almacenO,int n,int id1, int id2)
	{
		Paquete paquete = new Paquete();
		Date fecha = new Date();
		paquete.setCodigo(linea.substring(0, 9));
		
//		int anho = Integer.parseInt(linea.substring(9, 13));
//		int mes = Integer.parseInt(linea.substring(13, 15));
//		int dia = Integer.parseInt(linea.substring(15, 17));
//		int hora = Integer.parseInt(linea.substring(17, 19));
//		int min = Integer.parseInt(linea.substring(20, 22));
		String identificacion = linea.substring(22,26);
		String dia = linea.substring(9, 13)+"-"+linea.substring(13, 15)+"-"+linea.substring(15, 17)+" "+linea.substring(17, 19)+":"+linea.substring(20, 22)+":00";
//		fecha.setYear(anho-1900);
//		fecha.setMonth(mes);
//		fecha.setDate(dia);
//		fecha.setHours(hora);
//		fecha.setMinutes(min);
		try
		{
			fecha = format.parse(dia);
		}
		catch(Exception e){}
		paquete.setFechaRegistro(fecha);
		IServiciosGeograficosImpl geo = new IServiciosGeograficosImpl();
		Almacen almacenD = geo.hayCodigo(identificacion);
		
		CiudadDTO ciudadO = geo.getCiudad(almacenO.getCiudadId());
		CiudadDTO ciudadD = geo.getCiudad(almacenD.getCiudadId());
		
		if(ciudadO.getPais().getContinente().getId() == ciudadD.getPais().getContinente().getId())
			paquete.setMaxiraHoraLlegada(24);
		else
			paquete.setMaxiraHoraLlegada(48);

		paquete.setAlmacenDestino(almacenD.getId());//geo.hayCodigo(identificacion));
		paquete.setAlmacenActual(almacenO.getId());
		paquete.setAlmacenOrigen(almacenO.getId());
		paquete.setClienteRemintente(-1);
		paquete.setClienteDestinatario(-1);
		if(n==2)
		{
			paquete.setClienteRemintente(id1);
			paquete.setClienteDestinatario(id2);
		}
		paquete.setCosto(0.0);
		paquete.setDescripcion("");
		paquete.setEstadoPaquete(4);
		
		Calendar cal = Calendar.getInstance();
		cal.setTime(fecha);
		cal.add(Calendar.HOUR_OF_DAY,paquete.getMaxiraHoraLlegada());
		
		paquete.setFechaEstimadaLlegada(cal.getTime());
		paquete.setFechaRecojo(cal.getTime());
		paquete.setNroSecretoDestinatario(1);
		paquete.setNroSecretoRemitente(2);
		paquete.setVueloActual(0);
		paquete.setReservaDeAlmacen(0);
		paquete.setMaxiraHoraLlegada(12);
		paquete.setReruteo(false);
		paquete.setPlanDeVuelo(0);
		paquete.setFechaRealLlegada(null);
		//paquete.setFechaRecojo(fecha);
		//System.out.println(fecha.toString()+" "+anho+" "+mes+" "+dia+" "+hora+" "+min+" *"+identificacion+"*");
		return paquete;
	}
	
	public String ActualizarPaquete(Scanner in_scanner,HttpServletResponse resp,Almacen almacenO)
	{
		IServiciosPaqueteImpl paq = new IServiciosPaqueteImpl();
		try
		{
			List<Paquete> lista = new ArrayList<Paquete>();
			int ff = 0;
			int aa = 0;
			while(in_scanner.hasNext())
			{
				String linea = in_scanner.nextLine();
				
				Paquete paquete = obtenerPaquete(linea,almacenO,1,0,0);
				Paquete paquete2 = paq.obtenerPaquete(paquete.getCodigo());
				System.out.println("ff: "+ff);
				ff++;
				if(paquete2 != null)
				{
					paquete2.setAlmacenActual(paquete.getAlmacenActual());
					paquete2.setAlmacenDestino(paquete.getAlmacenDestino());
					paquete2.setFechaRealLlegada(paquete.getFechaRegistro());
					lista.add(paquete2);
					System.out.println("aa"+aa);
					aa++;
				}
			}
			if(lista.size()>0)
			{
				MantenimientoGenerico<Paquete> mantemiento = new MantenimientoGenerico<>("Paquete");
				mantemiento.registrarBatch(lista, 1000);
			}
			return "Se ha registrado "+lista.size()+" paquetes";
		}
		catch(Exception e)
		{
			return e.toString();
		}
	}
	
	public String RegistrarVuelo(Scanner in_scanner,HttpServletResponse resp)
	{
		try
		{
			List<Vuelo> lista = new ArrayList<Vuelo>();
			while(in_scanner.hasNext())
			{
				Vuelo vuelo = new Vuelo();
				String linea = in_scanner.nextLine();
				lista.add(vuelo);
			}
			return "Se ha registrado "+lista.size()+" vuelos";
		}
		catch(Exception e)
		{
			return e.toString();
		}
	}
	
	public String RegistrarPaqueteActual(Scanner in_scanner,HttpServletResponse resp,Almacen almacenO)
	{
		try
		{
			List<Paquete> lista = new ArrayList<Paquete>();
			
			Cliente cliente1 = new Cliente();
			Cliente cliente2 = new Cliente();
			cliente1.setNombre("Cliente1"); cliente1.setApellido1("apellido1"); cliente1.setApellido2("apellido2"); cliente1.setCorreo("juanc.jara@pucp.pe");
			cliente2.setNombre("Cliente2"); cliente2.setApellido1("apellido3"); cliente2.setApellido2("apellido4"); cliente2.setCorreo("drol005@gmail.com");
			MantenimientoGenerico<Cliente> man = new MantenimientoGenerico<>("Cliente");
			cliente1 = (Cliente)man.registra(cliente1);
			cliente2 = (Cliente)man.registra(cliente2);
			
			while(in_scanner.hasNext())
			{
				String linea = in_scanner.nextLine();
				
				lista.add(obtenerPaquete(linea,almacenO,2,cliente1.getId(),cliente2.getId()));
			}
			IServiciosPaqueteImpl paquete = new IServiciosPaqueteImpl();
			List<Paquete> sinRuta = paquete.CargaMasiva(lista);
			String mensajes =  "Se ha registrado "+lista.size()+" paquetes";
			mensajes += "\n" + "No tuvieron ruta " + sinRuta.size() + " paquetes";
			for(int i = 0; i < sinRuta.size(); i++)
				mensajes += "\n" + sinRuta.get(i).getCodigo();
			mensajes += "\n";
 			return mensajes;
		}
		catch (Exception e)
		{
			return e.toString();
		}
	}
}
